package src

import (
	"fmt"
	"os"
)

// FileUtil 文件操作工具类
type FileUtil struct {
	Path string // 文件路径
}

// NewFileUtil 创建一个新的 FileUtil 实例
func NewFileUtil(path string) *FileUtil {
	return &FileUtil{Path: path}
}

// Exists 检查文件或目录是否存在
func (f *FileUtil) Exists() (bool, error) {
	_, err := os.Stat(f.Path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

// Read 读取文件内容
func (f *FileUtil) Read() (string, error) {
	content, err := os.ReadFile(f.Path)
	if err != nil {
		return "", fmt.Errorf("读取文件失败: %v", err)
	}
	return string(content), nil
}

// Write 写入文件内容
func (f *FileUtil) Write(content string) error {
	err := os.WriteFile(f.Path, []byte(content), 0644)
	if err != nil {
		return fmt.Errorf("写入文件失败: %v", err)
	}
	return nil
}

// Append 追加内容到文件
func (f *FileUtil) Append(content string) error {
	file, err := os.OpenFile(f.Path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		return fmt.Errorf("打开文件失败: %v", err)
	}
	defer file.Close()

	if _, err := file.WriteString(content); err != nil {
		return fmt.Errorf("追加内容失败: %v", err)
	}
	return nil
}

// Delete 删除文件
func (f *FileUtil) Delete() error {
	err := os.Remove(f.Path)
	if err != nil {
		return fmt.Errorf("删除文件失败: %v", err)
	}
	return nil
}

// CreateDir 创建目录
func (f *FileUtil) CreateDir() error {
	err := os.MkdirAll(f.Path, 0755)
	if err != nil {
		return fmt.Errorf("创建目录失败: %v", err)
	}
	return nil
}

// GetSize 获取文件大小
func (f *FileUtil) GetSize() (int64, error) {
	info, err := os.Stat(f.Path)
	if err != nil {
		return 0, fmt.Errorf("获取文件信息失败: %v", err)
	}
	return info.Size(), nil
}

// 示例使用
func main() {
	// 创建文件工具实例
	fu := NewFileUtil("example.txt")

	// 检查文件是否存在
	exists, err := fu.Exists()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("文件是否存在: %v\n", exists)

	// 写入文件
	if err := fu.Write("Hello, Go!\n"); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("写入成功")

	// 读取文件内容
	content, err := fu.Read()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("文件内容: %s", content)

	// 追加内容
	if err := fu.Append("Additional line\n"); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("追加成功")

	// 再次读取文件内容
	content, err = fu.Read()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("更新后的文件内容: %s", content)

	// 获取文件大小
	size, err := fu.GetSize()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("文件大小: %d 字节\n", size)

	// 创建目录
	dirUtil := NewFileUtil("test_dir/subdir")
	if err := dirUtil.CreateDir(); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("目录创建成功")

	// 删除文件（注释掉以避免立即删除）
	// if err := fu.Delete(); err != nil {
	// 	fmt.Println(err)
	// 	return
	// }
	// fmt.Println("文件删除成功")
}
